שיא הסי-ים יורם ביברמן כל הזכויות שמורות למחבר. אין לעשות כל שימוש מסחרי בספר זה או בקטעים ממנו. ניתנת הרשות להשתמש בו לצורכי לימוד של המשתמש בלבד.

Similar documents
מבוא לתכנות ב- JAVA תרגול 7

A R E Y O U R E A L L Y A W A K E?

מבוא לתכנות - פיתוח משחקים ב Action Script 3.0

THINKING ABOUT REST THE ORIGIN OF SHABBOS

ניפוי שגיאות )Debug( מאת ישראל אברמוביץ

ASP.Net MVC + Entity Framework Code First.

תצוגת LCD חיבור התצוגה לבקר. (Liquid Crystal Display) המערכת.

מבוא למחשב בשפת פייתון

Rules Game (through lesson 30) by Nancy Decker Preparation: 1. Each rule board is immediately followed by at least three cards containing examples of

A JEW WALKS INTO A BAR: JEWISH IDENTITY IN NOT SUCH JEWISH PLACES

Patents Basics. Yehuda Binder. (For copies contact:

Advisor Copy. Welcome the NCSYers to your session. Feel free to try a quick icebreaker to learn their names.

שאלות חזרה לקראת מבחן מפמ"ר אינטרנט וסייבר

מכונת מצבים סופית תרגול מס' 4. Moshe Malka & Ben lee Volk

א נ ג ל י ת בהצלחה! ב. משרד החינוך בגרות לנבחנים אקסטרניים )מילון הראפס אנגלי-אנגלי-ערבי( השימוש במילון אחר טעון אישור הפיקוח על הוראת האנגלית.

המבנה הגאומטרי של מידה

FILED: NEW YORK COUNTY CLERK 07/16/2014 INDEX NO /2014 NYSCEF DOC. NO. 134 RECEIVED NYSCEF: 07/16/2014 EXHIBIT 37

בוחן בתכנות בשפת C בצלחה

שאלון ו' הוראות לנבחן

שאלון ד' הוראות לנבחן

שאלון ו' הוראות לנבחן

קשירות.s,t V שני צמתים,G=(V,E) קלט: גרף מכוון מ- s t ל- t ; אחרת.0 אם יש מסלול מכוון פלט: הערה: הגרף נתון בייצוג של רשימות סמיכות.

המחלקה למדעי המחשב, אוניברסיטת בן גוריון מבני נתונים, סמסטר אביב 2102 עבודת בית מספר - 2 מעשית

Practical Session No. 13 Amortized Analysis, Union/Find

(MODULE E) ב ה צ ל ח ה!

A Long Line for a Shorter Wait at the Supermarket

אנגלית (MODULE E) בהצלחה!

NATIONAL COUNCIL OF YOUNG ISRAEL. Shavuot Nation JEWISH EDITION. Compiled by Gabi Weinberg Teen Program Director

כ"ג אלול תשע"ו - 26 ספטמבר, 2016 Skills Worksheet #2

ב. משרד החינוך בגרות לנבחנים אקסטרניים א נ ג ל י ת (MODULE B) הוראות מיוחדות: )2( בתום הבחינה החזר את השאלון למשגיח. בהצלחה!

מספר השאלון: Thinking Skills נספח: כישורי חשיבה )לפרק ראשון ושני( א נ ג ל י ת (MODULE F) ספרות )מילון הראפס אנגלי-אנגלי-ערבי(

Reflection Session: Sustainability and Me

תכנית סטארט עמותת יכולות, בשיתוף משרד החינוך א נ ג ל י ת שאלון ב' Corresponds with Module B גרסה ב' הוראות לנבחן

אנגלית שאלון ז' ג רסה א' הוראות לנבחן בהצלחה! )4( ההנחיות בשאלון זה מנוסחות בלשון זכר ומכוונות לנבחנות ולנבחנים כאחד. (MODULE G)

תכנית סטארט עמותת יכולות, בשיתוף משרד החינוך א נ ג ל י ת שאלון א' Corresponds with Module A (Without Access to Information from Spoken Texts) גרסה א'

ב. משרד החינוך בגרות לנבחנים אקסטרניים א נ ג ל י ת (MODULE B) הוראות מיוחדות: )2( בתום הבחינה החזר את השאלון למשגיח. בהצלחה!

זו מערכת ישרת זוית )קרטזית( אשר בה יש לנו 2 צירים מאונכים זה לזה. באותו מישור ניתן להגדיר נקודה על ידי זוית ורדיוס וקטור

טכנולוגיית WPF מספקת למפתחים מודל תכנות מאוחד לחוויית בניית יישומיי

Name Page 1 of 6. דף ט: This week s bechina starts at the two dots in the middle of

ANNEXURE "E1-1" FORM OF IRREVOCABLE STANDBY LETTER OF CREDIT PERFORMANCE OF CONTRACT (WHERE PRICES ARE NOT LINKED TO AN ESCALATION FORMULA)

Interrogatives. Interrogative pronouns and adverbs are words that are used to introduce questions. They are not inflected for gender or number.

Name Page 1 of 5. דף ז. This week s bechina begins with the fifth wide line at the top of

SHABBAT UNPLUGGING & RECONNECTING

מבוא לתכנות - פיתוח משחקים ב Action Script 3.0

Global Day of Jewish Learning

ב "ה. ABC s of Judaism. Fundamentals of Jewish Thought and Practice. June 2007 Tammuz 5767 Jewish Educational Institute Chabad Brisbane

עץ תורשה מוגדר כך:שורש או שורש ושני בנים שכל אחד מהם עץ תורשה,כך שערך השורש גדול או שווה לסכום הנכדים(נכד-הוא רק בן של בן) נתון העץ הבא:

מבחן באנגלית בהצלחה הצלחה!!! שם פרטי: שם משפחה: מס' תעודת זהות: תאריך: שם מרכז מנהל מרכז השכלה: תאריך בדיקת המבחן: כל הזכויות שמורות למשרד החינוך

FILED: NEW YORK COUNTY CLERK 07/16/2014 INDEX NO /2014 NYSCEF DOC. NO. 102 RECEIVED NYSCEF: 07/16/2014 EXHIBIT 5

בהצלחה! (MODULE C) Hoffman, Y. (2014). The Universal English-Hebrew, Hebrew-English Dictionary

אנגלית שאלון ז' (MODULE G) ג רסה א' הוראות לנבחן )מילון אנגלי-ערבי / ערבי-אנגלי )

מושגים בסיסיים תלמידים והורים יקרים,

eriktology The Writings Book of Ecclesiastes [1]

Global Day of Jewish Learning

נספח: כישורי חשיבה )לפרק ראשון ושני( אנגלית (MODULE F) ספרות או: מילון אנגלי-ערבי / ערבי-אנגלי או: מילון אנגלי-אנגלי-ערבי

סה"כ נקודות סה"כ 31 נקודות סה"כ 21 תוכן עניינים של פתרון המבחן. לולאת for )נתון אלגוריתם... מעקב, פלט

SEEDS OF GREATNESS MINING THROUGH THE STORY OF MOSHE S CHILDHOOD

זה. Nir Adar

Hebrew Ulpan HEB Young Judaea Year Course in Israel American Jewish University College Initiative

הצגת המשחק תלמידים משחקים סיום. פתיחה 12 min. min. min. min פתיחה. Copyright 2015

אנגלית ספרות בהצלחה! /המשך מעבר לדף/ נספח: כישורי חשיבה )לפרק ראשון ושני( או: מילון אנגלי-ערבי / ערבי-אנגלי או: מילון אנגלי-אנגלי-ערבי

Bereshit / Exodus 18:1-20:23, Isaiah 6:1-7:6, 9:5-6, Matthew 6:1-8:1. Parashat Yitro

תרגול 8. Hash Tables

חוק זכויות הסוכן חוק חוזה סוכנות )סוכן מסחרי וספק(


מבוא לאסמבלי מאת אופיר בק חלקים נרחבים ממאמר זה נכתבו בהשראת הספר "ארגון המחשב ושפת סף" אשר נכתב ע"י ברק גונן לתוכנית גבהים של משרד החינוך.

Chofshi.

DNS פרק 4 ג' ברק גונן מבוסס על ספר הלימוד "רשתות מחשבים" עומר רוזנבוים 1

התכנית הראשונה שלי

מבוא לשפת C מבוא לשפת סי - תירגול 1

ãówh,é ËÓÉÔê ÌW W É Å t" Y w f É ËÓÉÑ É èw É f Ñ u ð NNM YóQ' ÌW W É Y ÉgO d óqk É w f ym Éd É u ð NNM ÌWNQMH uqo ð NNM ÌWNQMH

Structural Vs. Nominal Typing

eriktology Torah Workbook Bereshiyt / Genesis [1]

הטכנולוגיה בחינוך ד ר קובי גל אוניברסיטת בן גוריון בנגב

נספח: כישורי חשיבה )לפרק ראשון ושני( אנגלית (MODULE F) ספרות מילון אנגלי-אנגלי-עברי או מילון אנגלי-עברי-עברי-אנגלי

Chapter 11 (Hebrew Numbers) Goals

JUDAISM AND INDIVIDUALITY

נספח: כישורי חשיבה )לפרק ראשון ושני( אנגלית (MODULE D) ספרות או מילון אנגלי-עברי-עברי-אנגלי

Global Day of Jewish Learning

7 קרפ תויגול,תויטמתירא תודוקפ הזזהו

עד כה עסקנו בתוכניות שמתקדמות פקודה אחרי פקודה העתק ל- ax את הערך 3 העתק ל- bx את הערך 4 הוסף ל- ax את bx כפול את התוצאה ב- 2 והעתק ל- cx

Eight Lights Eight Writes

נספח: כישורי חשיבה )לפרק ראשון ושני( אנגלית (MODULE D) ספרות מילון אנגלי-אנגלי-עברי או מילון אנגלי-עברי-עברי-אנגלי

Theories of Justice

Extraordinary Passages:

Parallel Processing. Administration. Dr. Guy Tel-Zur.

נספח: כישורי חשיבה )לפרק ראשון ושני( אנגלית (MODULE D) ספרות או מילון אנגלי-עברי-עברי-אנגלי

פיזיקה של נהיגה מדריך למורה

F E E T O N G R O U N D, HEAD I N T H E C L O U D S

L fi-kach Nivrah Adam Yehidi! That is why Adam was created all alone!

מבוא לשפת C תירגול 1: מבוא מבוא לשפת סי - תירגול 1

נילי חמני

Parashat Balak. Sharon Rimon

Apple, keys, pen, pencils, pencilbox,(toy)elephant,( toy) boy, (toy) girl, ball

Hebrew Adjectives. Hebrew Adjectives fall into 3 categories: Attributive Predicative Substantive

BEING A VISIONARY JOLT LEADERSHIP PROGRAM 2014

םימתירוגלאו םינותנ ינבמ המירעו תינס, חמ רות רקצול הנילופ

מספר השאלון: הצעת תשובות לשאלות בחינת הבגרות אנגלית (MODULE C) מילון אנגלי-אנגלי-עברי או מילון אנגלי-עברי-עברי-אנגלי قاموس إنجليزي - إنجليزي - عربي

טו: and ends on the bottom of

במבוא מורחב למדעי המחשב בשפת פייתון

Transcription:

שיא הסי-ים (C/C++) מאת: יורם ביברמן כל הזכויות שמורות למחבר. אין לעשות כל שימוש מסחרי בספר זה או בקטעים ממנו. ניתנת הרשות להשתמש בו לצורכי לימוד של המשתמש בלבד. ינואר 211

ליעננ שבכל אחד מאיתנו, לנ. של כולנו ולמאבק איתם ובהם ב ע ר ב כ ש אָמ ר ה ל י נ ע ר ת י ל ך י ר ד ת י ל ר חוֹב ל ה ת ה ל ך ו ה י ית י הוֹל ך וּמ ס ת ב ך מ ס ת ב ך ו הוֹל ך ו הוֹל ך ו הוֹל ך וּמ ס ת ב ך (נתן זך) 2

מבוא עודכן 9/9 ספר זה מסכם את הניסיון (תרתי משמע) המצטבר של כותב שורות אלה להורות את הקורס (ובהוראת הקורס) מבוא למדעי המחשב (הנקרא גם מבוא לתכנות). ניסיוני לימד אותי כי קורס זה הינו פרדוקסאלי במובן זה שלכאורה אף תלמיד ממוצע משנה ג' מסוגל היה, לכל הפחות מבחינת חומר הלימוד, ללמד את הקורס על נקלה, אך למעשה רבים וטובים מתקשים להנחיל את החומר המועבר בו לתלמידיהם. מניסיוני שלי אני יכול להוסיף, שאף ששנים רבות של הוראת הקורס מאחורי, אני ממשיך כל העת לשפר את כישור י. להרגשתי, הסיבה לפרדוקסאליות היא שרכישת המיומנות התכנותית מחייבת את הלומד בביצוע 'קפיצה' בלתי ניתנת להסבר, כלומר בביצוע מעבר לא רציף ממצב של מי שאינו יודע לתכנת, לכדי מי שמסוגל 'לחשוב תכנותית', במילים אחרות לתרגם, כמעט מבלי משים, משימה המנוסחת במונחים מילוליים, לכ די תכנית מחשב. הפער בין שתי העמדות הוא כמעט בלתי ניתן להבנה, או לאמפתיה (הן מצד זה, והן מצד זה), ולכן קשה עד מאוד למתכנת מיומן להיכנס לנעליו של זה מקרוב בא, באותה המידה שקשה ומתסכל ל תלמיד הנבוך לרכוש את המיומנויות הדרושות, שכן אין כל דרך ברורה שאם יפסע בה הוא מובטח שיגיע למטרה ; על המתכנת הצעיר פשוט לטעות, טעייה כואבת, במבוך התכנותי עד שילמד את רזיו. חוששני גם שלא לכל עמיתי המלומדים יש את אורך הרוח ללוות את תלמידיהם הנבוכים במסעם, בה במידה שלא לכל התלמידים יש את אורך הרוח, יכולת ההתמדה, והנכונות ליפול ולקום עד שהם ילמדו לזחול, ללכת, ולבסוף גם לרוץ. על- כן אני משתדל לחקוק הן על לוח לבי והן על זה של תלמיד י את המאמר "לא הבישן למד, ולא הקפדן מלמד". ל תלמיד בראשית דרכו עלי לומר מייד, ייתכן שחומר הלימוד שיופיע בהמשך יהיה נהיר לך 'כספר הפתוח', וייתכן שלא, ייתכן שהסבריו של המורה שילמד אותך יהיו פשוטים ובהירים, וייתכן שלא, בכל מקרה תגלה (למרבה המכאוב) כי קיים פער מפתיע ומתסכל בין היכולת להבין את תכניות המחשב שהוצגו בפניך, לבין היכולת לכתוב בעצמך תכניות. הדרך היחידה להתגבר על פער זה היא באמצעות תרגול, תרגול, תרגול. כל תכנית נוספת שתכתוב תקדם אותך יותר ממאה תכניות שתקרא, (קל וחומר מאלף קיטורים שתק ט ר). מסיבה זאת כללתי בספר תרגילים לא מעטים שיאפשרו לך לנסות, ועל-ידי כך להעצים, את כוחך שלך בכתיבת תכניות. בנקודה זאת, טרם שאנו צוללים לים התכנותי, ראוי להוסיף גם מילת אזהרה: דעו לכם שמי שרוצה לעסוק בתכנות צפוי לבלות שעות רבות, וקשות, על שטויות: נקודה פסיק (;) שנשמטה, כוכבית (*) שהוצבה שלא במקומה, ושאר טעויות פעוטות, שעת אנו נתקלים בהם במקומות אחרים אנו לכל היותר מחייכים, ונדים בראשנו, אך בתכנית מחשב הם יכולים לעשות את כל הפער בין איגרא רמא, לבירה עמיקתא. בשעה יפה זאת של התחלה, עת כולנו נרגשים, ועם חיוך מנצח על השפתיים שהגענו עד הלום, אני רוצה להזהיר אתכם שכבר ראיתי לא מעט תלמידים עם דמעות בעיניים ומשוּכנעוּת בלב שהמחשב החליט באופן אישי ונחרץ להוציאם מדעתם, ויהי מה, שכן העו ולות שהוא מעולל להם (בדרך כלל בשעות הקטנות של הלילה) הן באמת מעל ומעבר לכל דמיון. לכל מי שייקלע למצב זה אני רוצה לומר כבר עתה שאכן לעיתים התנהגותו של המחשב יכולה להיות אכזרית טירון, אך שהוא שומר לעצמו את הזכות לנהוג כך אך ורק כלפי מי שהוא חש שהינו, שאצבעותיו עוד לא מיומנות בנגינה על המקלדת. כלפי מנוסים יותר הוא, בחיים, לא יעז לנהוג כך. על כן העצה היחידה היא לחרוק שיניים ולהמשיך לשחות. 3

לעיתים, אם הדבר אפשרי, עצה ממתכנת מעט יותר מנוסה עשויה לחסוך לכם כאב רב, אולם אין מנוס מלהתמודד עם הקשיים בכוחות עצמכם; רק כך תלמדו. צדו השני של המטבע הוא שלהתרשמותי אך מעטים 'אינם בנויים' או 'אינם מתאימים' לתחום המחשבים. מט בע הדברים יש מי שהדברים הולכים לו פחות בקושי, ויש מי שהם הולכים לו יותר בקושי, אולם, לדעתי, לא נדרש כשרון ייחודי כלשהו, ורוב מי שיתאמץ מספיק, וית ר גל מספיק, בסוף גם יצליח. ראיתי כבר לא מעט תלמידים שנראו לי בינוניים בכישוריהם, אך עם כוח רצון עז, ששרדו, ולעומתם תלמידים מבריקים שלא הייתה להם הנכונות לשאת בעול הסיזיפי לעיתים ו ויתרו. בה ק שר זה אני רוצה גם לומר שאם אתם רואים מישהו יושב מול המחשב עם חיוך נינוח על השפתיים, תוך שהוא מפזר לצדדים הערות מזלזלות על התכנית שיש לכתוב דעו שהוא : (א) משקר, או (ב) כבר היה בעבר במקום בו אתם מצויים עתה, ועל-כן עתה הוא כבר קדימה יותר; כל כמה שזה נראה לכם לא אפשרי, תוך זמן מה גם אתם תתייחסו לתכניות שנראות לכם עתה מחסום בלתי עביר, כאל משימה פשוטה למדי. בנוגע לכתיבת תכניות. מהיכרותי את טבע האדם, והסטודנט, אני יודע שעת תלמיד מתבקש להתמודד עם תרגיל חדש, על חומר שזה עתה נלמד, הוא, בדרך כלל, פועל בשיטת שלושת השלבים: (א) הוא מציץ בדף התרגיל, ומזדעזע קשות מאכזריותו של מי שניסח אותו. (ב) הוא דוחף את דף התרגיל עמוק ככל שניתן לת יקו, ומשתדל, בדרך כלל בלי הצלחה יתרה, לשכוח ממנו לכמה זמן, עד שהוא יירגע מהתרגיל הקודם. (ג) מספר ימים לפני מועד ההגשה הוא שולף בכאב לב את דף התרגיל ומנסה להתמודד א תו; אך אז כבר אין די זמן לאתר את המורה ולהתייעץ עמו, יש לעבוד בשעות בהם הדעת כבר אינה צלולה, ומק דם הלחץ כבר בשיאו, במיוחד שמסביב כבר נשמעים דיבורים של תלמידים שלכל הפחות נשמעים כמי שכמעט סיימו את העבודה על התרגיל. כאן עלי להזהירכם משני כשלים נוספים: (א) לעולם אל תעתיקו תרגיל, אל 'תציצו' בתרגיל של חבר 'רק כדי לקבל רעיונות', ואל תעבדו עם חבר ששולט בחומר טוב מכם וש- 'רק יסייע לכם'. אתם יורים כך לעצמכם כדור ברגל! מורה הקורס עייף מלשבת ב-'משפטי שלמה' כאלה או אחרים בהם עליו להכריע מי כתב תכנית כלשהי, ובאיזה מידה הוא עשה זאת באופן עצמאי. מנגד, כמיטב יכולתנו אנו מנטרים את הנושא ובמידת הצורך מקשים את לבנו, ומענישים בחומרה את מי ששגה. (ב) לעולם אל תתנפלו על המחשב טרם שכתבתם את התכנית בנחת על דף עם עפרון ומוחק. רק אחרי שכתבתם, תיקנתם, שיניתם, ואתם משוכנעים שהפעם יצאה תחת ידכם יצירת מופת שאפילו מחשב אכזרי ייאלץ להודות שהיא מושלמת, הדליקו את המחשב. סביר להניח שתגלו שעדיין יש בתכניתכם שגיאות רבות, אך מנגד שיש בה כבר גם גרעין של תכנית סבירה שניתן לשפץ. התנפלות על המחשב עם תכנית שלא נבדקה על-ידכם בראשכם שוב ושוב, היא מתכון לתסכול, זעם, ובמקרה הטוב לתכנית מסורבלת שנראית כמו טלאי על טלאי (ובמקרה הרע לקטסטרופה). הקפידו עד מאוד להגיש את כל התרגילים הניתנים לכם. הניסיון מלמד שתלמיד שלא הגיש שני תרגילים רצופים יכול לראות את עצמו כמי שמצוי עם יותר מאשר רגל אחת בחוּץ. בקורס זה נלמד את שפת ++C או ליתר דיוק חלק משפה זאת. שפת ++C היא שפה עשירה מאוד, ועל כן בזמן המוקצה לקורס זה לא נוכל, וגם לא נזדקק, להיכרות מלאה עמה. יחד עם זאת אני ממליץ לתלמיד השקדן, בהמשך הדרך, אחרי שהיכרותו עם המרכיבים הבסיסיים של השפה תשתפר, לקרוא בספרים, וללמוד את היבטים נוספים של השפה, וכל המרבה הרי זה משובך. בפרט ובמיוחד לא נכיר חלק לא מבוטל של השפה המאפשר תכנות בגישה הקרויה 'תכנות מונחה עצמים ' Programming).(Object Oriented בקורס זה נתמקד בגישה תכנותית הקרויה 'תכנות 4

מודולארי' Programming).(Modular נראה לנו כי מכיוון שבעולם התכנות קיימות פרדיגמות שונות, והתכנות המודולארי הוא פרדיגמה חשובה, אזי מתאים להיכנס לעולם התכנות דרך שער זה, ואת הגישה מונחית העצמים להותיר לקורס המשך, בפרט לכזה במבני נתונים, בו גם טבעי לתכנת עם אובייקטים. מנגד, ב קורס לא נסתפק רק בהיכרות עם שפת ++C אלא נשאף לרכוש את מיומנות התכנות המודולארי. מניסיוני, רכישת צורת החשיבה המודולארית היא אחד האתגרים המרכזיים הניצבים בפני התלמיד, אחרי שהוא התגבר על האתגר הבסיסי של השימוש בפקודות שמעמידה לרשותו השפה. כאמור, ב קורס נלמד את שפת ++C. למעשה מרביתו המוחלטת של החומר שילמד משותפת לשפת ++C ולשפת C, ורק כמה נושאים משניים שנכיר נכללים בשפת ++C, אך לא בשפת C. דווקא הנושא כמעט הראשון שנכיר: קלט ופלט, שייך לרשימת הנושאים בהם השפות נבדלות זו מזו; ולמעשה אחת הסיבות המרכזיות בגינן החלטתי ללמד בקורס הנוכחי את שפת ++C היא כדי לחסוך מהסטודנט הנבוך, את המפגש עם פקודות הקלט\פלט המכוערות של שפת C כבר בתחילת דרכו. מעבר לנושא זה קיימים עוד כמה נושאים שוליים בהם השפות נבדלות (משתנים מטיפוס,bool פרמטרי הפניה, קבועים); עת נגיע לנושא כזה אציין זאת מפורשות. אומר זאת אחרת: להערכתי, תלמיד שירכוש שליטה בחומר הנלמד בקורס הנוכחי צריך להיות מסוגל יחסית בקלות ובזריזות לעבור לתכנת בשפת C. כמות ההתאמות או השינויים שידרשו ממנו יהיו מעטים. הקורס בו אנו עוסקים נקרא מבוא למדעי המחשב, ולא קורס בשפת ++C, או קורס בתכנות; ולא בכד י. חלקים נרחבים מהקורס מוקדשים לנושאים נוספים במדעי המחשב; בעיקר להיכרות עם מבני נתונים שונים, אלגוריתמים, ושאלת זמן הריצה של תכניות. חלק מרכזי של הקורס עוסק באלגוריתמים רקורסיביים שונים, ובטיפול בסיסי במבני נתונים כגון רשימות ועצים. ההיכרות עם הנושאים הכלליים נעשית תוך התמקדות במימושם בשפת ++C. המטרה היא להביא את התלמיד לכדי מיומנות תכנותית מעמיקה בנושאים אלה, ולצ דה להיכרות בסיסית עם ההיבטים התיאורטיים שלהם. ההיבטים התיאורטיים נלמדים בצורה לא פורמאלית, תוך 'נפנוף ידיים' מתוך תקווה שכך נקל יהיה עליכם לקבל את האינטואיציה הדרושה, אותה תבססו בהבנה פורמאלית יותר של הנושאים בקורסים עתידיים. נושא נוסף שנלמד בצורה די יסודית הוא אופן הקצאת הזיכרון לתכניות. השאיפה היא להקנות לתלמידים הבנה עקרונית של האופן בו מוקצה זיכרון על הערמה ועל המחסנית במהלך קריאות לפונקציות, ועת התכנית מקצה זיכרון דינמי. אחד הגורמים שהביאוני לכתיבת ספר זה הייתה התחושה ששפת ++C, יחד עם הנושאים הנוספים אותם יש צורך לכסות בקורס זה, רחבים מכדי שהזמן שעומד לרשותי בכיתה יאפשר לי להורות אותם ב נינוחות בה הייתי חפץ לעשות זאת. מכאן אני גוזר המ לצה ל תלמידים לקרוא את חומר הלימוד ב נינוחות, גם אם להרגשתכם באותה שעה, ההסברים בכיתה היו יחסית נהירים לכם; קל וחומר אם לאו. לא מן הנמנע שקריאה נינוחה תעזור לכם להבהיר נושאים שאולי אפילו לא הבחנתם שלא היו די ברורים לכם, או שלא כל השתמעויותיהם היו לנגד עיניכם. מסיבה זאת אני גם נוטה להמליץ לחזור ולקרוא בשנית נושאים אותם למדתם בעבר. ייתכן כי בשעה שלמדתם את החומר בראשונה היו היבטים משניים שבצוק העיתים לא הובנו על-ידכם די צרכם. עתה, שהחומר הבסיסי הוט מע על-ידכם טוב יותר, מן הסתם בעקבות תרגולו, תוכלו להתפנות לקלוט נקודות שלא נקלטו בסערת הקרב הראשונה. מנגד, אין טעם לעסוק בשינון החומר, או התכניות המוצגות, די להבינם. 5

אחת ההתלבטויות המרכזיות שעמדו בפני עת ניגשתי לכתוב ספר זה הייתה הבאה: אני מטיף לתלמידי הש כם והערב כי הנכס החשוב ביותר ע מו הם יכולים לצאת משערי האקדמיה הוא היכולת לקרוא חומר כתוב באנגלית. אני מוסיף כי הם יילמדו בבית-ספרנו נושאים רבים, מגוונים, ומעשירים. אחר הם ייבחנו על אותם נושאים, ואז הם יישכחו את תלמודם. מה אם כן יישאר ל תלמידים? מה הם בכל אופן יילמדו? הם יילמדו ללמוד. הם יעשירו את צורת החשיבה שלהם, ובדרך מסתורית כלשהי החומר הרב שהם יילמדו, ואחר יישכחו, יק ל עליהם ללמוד נושאים אחרים לגמרי, אשר יעסיקו אותם אחרי תום לימודיהם. אולם הבסיס ל יכולת ללמוד, הוא היכולת לקרוא; וכאשר במקומותינו אומרים 'היכולת לקרוא' אין הכוונה לקרוא את התנ"ך בשפת המקור (מעשה יפה כשלעצמו, אך לא רלוונטי לענייננו), אלא הכוונה היא לקרוא חומר טכני הכתוב באנגלית. ובכן, מחד גיסא אני מטיף לרכישת מיומנות הקריאה באנגלית, ומאידך גיסא אני מציע לתלמידים חומר בעברית. זו אכן דילמה. להגנתי אני אומר כי בסמסטר הראשון של שנת הלימודים הראשונה מגיעות לתלמידים הקלות והנחות מתוקף מעמדם כ- 'אפרוחים'. הנחות שהולכות ובטלות ככל שהם גדלים. עלי להודות שאיני חש שלם לחלוטין עם טענה זאת, ועל כן אני קורא לכם: למרות שהספר שלפניכם כתוב בעברית, ל מדו ובעיקר ה תרגלו לקרוא חומר באנגלית. זה מאוד חשוב! ומילה אחרונה לתלמידים שהחלו אך זה עתה ללמוד במוסד להשכלה גבוהה: כשאני הייתי בצבא, נהגו המ"כים לשאוג על הטירונים: "צאו מההלם!". המ"כים צדקו בכך שרבים מהטירונים אכן היו שרויים בהלם מסוים עם גיוסם לצבא, בשל המעבר החד מחיי התיכוניסט המצוי לזה של הטירון הבזוי. המ"כים שגו בכך שהם שאגו על הטירונים לצאת מההלם במקום לסייע להם בכך. להתרשמותי, גם תלמידי שנה א' מצויים בהלם מסוים סביב המעבר החד מהצבא, הטיול בחו"ל, או כל מקום אחר ממנו הם הגיעו, לחיים אקדמיים תובעניים מאוד (במיוחד בתחום המחשבים). מטבע הדברים, עם הזמן מסתגלים הסטודנטים למעמדם החדש, ואורך החיים הנגזר ממנו (שעות מול מסך המחשב, במקום מול זה של הסינימטק); אולם ההסתגלות דורשת זמן, ושלב מש ברי הינו בלתי נמנע. אלה שיכולים להרשות לעצמם, לפחות בסמסטר הראשון, להתרכז בלימודים, טוב יעשו אם יניחו בצד עיסוקים אחרים, לכל הפחות עד שייקלו מעט המים. לסיכום, אתם יוצאים מכאן למסע לא קל. מעניין, אולי גם מעשיר, אך כזה המבטיח לא מעט דם,יזע ודמעות. אני מודה שלא הייתי רוצה להתחלף אתכם, זה לא תענוג להיות תלמיד לתואר ראשון, בטח ובטח שלא במחשבים, ובטח ובטח ובטח שלא תלמיד שנה א' למחשבים. ומנגד, כשלעצמי, אני שמח על המקום בו אני ניצב, ושאליו לא יכולתי להגיע בלי להיות קודם גם במצבכם דרך צל חה. תודות והפצרות כתיבתו של ספר זה התאפשרה רק תודות לדורות של תלמידים שהניחו את ז קנם (מרצונם, או שלא מתוך בחירה) תחת תערו של כותב שורות אלה, וא פשרו לו לרכוש ולשכלל את ניסיונו. על-כן ראשונים לכל ראויים הם לתודתי. כמו כן רציתי להודות למורים הרבים שלימדו לצדי לאורך השנים, ותרמו לנושאים המוצגים בספר זה. בפרט אודה ל: דני ברנד, קלרה קדם, שוקי שגיב, מיכל פרנס, תמי וילנר, והצעירים חסרי המנוחה דן צפריר וגיל בז'רנו שגם הקציעו את שליטתי שלי בשפת ++C. ברבות השנים נוספו לקודמים גם: זיו בלשאי, מוטין פריימן, דני זובין שקידמוני עוד צעד. לבסוף אודה למוסדות להשכלה גבוהה השונים בהם שהיתי, ועודני שוהה, ושאפשרו לי להגיע עד הלום. 6

למרות המחשבה והעבודה הרבה שהושקעה בכתיבת ספר זה אין לי ספק שהוא כולל בחובו גם פגמים שונים ומשונים. אודה על כן לכל מי שיאות להאיר את עיני על קלה כחמורה: א. שגיאות כתיב, כתב, ניסוח או שפה. ב. חומר שאינו מוסבר בצורה די בהירה. ג. חומר שאינו מוסבר כלל וראוי היה שיוסבר. ד. חומר שמוסבר אולי כהלכה אך באופן שגוי! הערות תתקבלנה בברכה באמצעות הדואר האלקטרוני: 7

תוכנן עניינים.1 הקדמה 12... 1.1 הזיכרון 12... 1.2 המעבד 13... 1.3 שפת מכונה, שפת הרכבה, ושפה עילית... 14 1.4 האדיטור, והדיבגר... 16 1.5 מערכת ההפעלה...16 1.6 ציוד המתחבר למחשב... 17 1.7 שפת 18... C 1.8 האלגוריתם 19... 2. תכניות ראשונות...21 2.1 תכנית ראשונה: מבנה תכנית, ופקודת הפלט...21 cout 2.1.1 שורת ה- main()...int 21 2.1.2 פקודת הפלט... cout 22 2.1.3 שורת ה-...#include 24 2.1.4 עימוד... 24 2.2 תכנית שניה: משתנים, טיפוסי משתנים ופעולות אריתמטיות...25 2.2.1 משתנים (variables)... 25 2.2.2 פקודת ההשמה... 26 2.2.3 פעולות אריתמטיות... 27 2.2.4 המרת טיפוס... 28 2.2.5 טיפוסים מספריים נוספים... 29 2.2.6 פקודת הפלט... 31 cout 2.3 תכנית שלישית: פקודת הקלט,cin ותיעוד... 31 2.3.1 פקודת הקלט...cin 32 2.3.2 תעופה של תכנית... 33 2.3.4 תיעוד (documentation)... 34 2.3.5 פקודת הפלט... 36 cout 2.4 תרגילים 36... 3. פקודות תנאי...38 3.1 פקודת if (ללא 38...(else 3.1.1 מוטיבציה... 38 3.1.2 דוגמה ראשונה לשימוש ב-...if 39 3.1.3 תנאים... 4 3.1.4 גוש... 41 (block) 3.2 תוספת 42... else הערכה מקוצרת של ביטויים בולאניים... 43 3.2.1 תנאים מקוננים... 43 3.2.2 מיון שלושה מספרים (גירסה א')... 44 3.2.3 מיון שלושה מספרים (גרסה ב')... 46 3.2.4 3.2.5 מיון שלושה מספרים (גירסה ג')... 49 שורשי משוואה ריבועית... 5 3.2.6 שרשרת של if ו-...else 53 3.2.7 3.3 משתנים בולאניים...54 3.3.1 הקשר בין ביטויים אריתמטיים לביטויים בולאניים... 57 3.4 פקודת 58... switch 3.5 אופרטור ה-?...6 3.6 תרגילים 61... 4 3.6.1 תרגיל מספר אחד: הצגת יום בשבוע... 61 3.6.2 תרגיל מספר שתיים: הצגת תאריך במילים... 62 3.6.3 תרגיל מספר שלוש... 62 לולאות... 63 8

4.1 פקודת ה- 63...while 4.1.1 4.1.2 4.1.3 4.1.4 4.1.5 4.1.6 4.1.7 4.1.8 4.2.1 4.2.2 4.2 4.3 4.4 4.5 5 דוגמות ראשונות... 63 הדפסת כפולותיו של מספר... 65 הדפסת לוח הכפל... 65 זמן ריצה של תכנית... 66 הדפסת מחלקי מספר... 68 בדיקה האם מספר ראשוני, ופקודת break מלולאה... 7 הדפסת מחלקיו הראשוניים של מספר... 73 ניחוש מספר שהמחשב הגריל, ומושג הקבוע...(const) 75 פקודת ה-...79 for בדיקה האם זוג מספרים טבעיים הם חברים... 8 הערות נוספות אודות פקודת ה-... for 83 פקודת ה- 85...do-while 86...continue תרגילים...87 תרגיל מספר אחד: מציאת שורשים שלמים... 87 4.5.1 תרגיל מספר שתיים: חישוב סדרת שתיים שלוש... 87 4.5.2 תרגיל מספר שלוש: הצגת מספרים ראשוניים עוקבים... 87 4.5.3 תרגיל מספר ארבע: חנות השטיחים... 87 4.5.4 תרגיל מספר חמש: חידת אותיות ומספרים... 88 4.5.5 תרגיל מספר שש: הצגת סדרת מספרים בשורות... 89 4.5.6 תרגיל מספר שבע: איתור מספר שהתכנית הגרילה... 89 4.5.7 תרגיל מספר שמונה: מספר הספרות הנדרשות להצגת מספר... 9 4.5.8 תרגיל מספר תשע: בדיקה האם מספר הינו פלינדרום... 9 4.5.9 תרגיל מספר עשר: ייצור פלינדרום ממספר נתון... 9 4.5.1 תרגיל מספר אחת-עשר: חישוב סטטיסטים שונים על סדרת מספרים... 9 4.5.11 תרגיל מספר שתיים-עשרה: חישוב רדיוס מעגל באופן איטרטיבי... 9 4.5.12 תרגיל מספר שלוש-עשרה: בדיקה כמה מספרותיו של מספר א' מופיעות במספר ב'... 91 4.5.13 מערכים חד-ממדיים... 92 5.1 מהו מערך... 92 5.2 דוגמות ראשונות לשימוש במערך...93 5.3 מציאת האיבר המרבי במערך, והיכן הוא מופיע... 94 5.3.1 איתור האיבר המרבי ומופעיו בשיטת שני המעברים... 95 5.3.2 איתור האיבר המרבי ומופעיו בשיטת שני המערכים... 95 5.3.3 השוואת שני הפתרונות... 97 5.3.4 עיון חוזר בפקודת ההגדלה העצמית... 97 5.4 חיפוש במערך... 98 5.4.1 חיפוש במערך לא ממוין... 98 5.4.2 חיפוש במערך ממוין... 99 5.5 מיון בועות sort) (Bubble... 12 5.6 איתור מספרים ראשוניים בשיטת הכברה... 15 5.7 תרגילים... 17 5.7.1 5.7.2 5.7.3 5.7.4 5.7.5 5.7.6 5.7.7 5.7.8 תרגיל מספר אחד: תרגול פשוט של מערכים חד-ממדיים... 17 תרגיל מספר שתיים: סדרת שתיים שלוש... 18 תרגיל מספר שלוש: ניהול טבלה בליגת כדור-רגל... 18 תרגיל מספר ארבע: מיקום ציר במערך... 11 תרגיל מספר חמש: משולש פסקל... 111 תרגיל מספר שש: חישוב מספר צירים בפרלמנט... 111 תרגיל מספר שבע: מציאת חציון ושכיח... 113 תרגיל מספר שמונה: מציאת ערך מרבי במערך יוני-מודלי... 113 6 מערכים רב-ממדיים... 114 6.1 דוגמות ראשונות... 114 6.2 בדיקה האם מטריצה מהווה ריבוע קסם... 118 6.3 בדיקה האם מערך קטן משוכן במערך גדול... 119 6.4 איקס-עיגול נגד המחשב... 122 6.5 משתנים ברי-מנייה, משתנים מטיפוס...enum 124 6.6 מערכים תלת-ממדיים... 126 6.7 איתחול מערכים... 127 6.8 תרגילים... 129 9

6.8.1 תרגיל מספר אחד: איתור מסלול במערך... 129 6.8.2 תרגיל מספר שתיים: משחק אווירונים וצוללות... 129 6.8.3 תרגיל מספר שלוש: תכנית CAD-CAM פרימיטיבית... 131 6.8.4 תרגיל מספר ארבע: איתור תת-מערך רצוי בתוך מערך דו-ממדי... 131 6.8.5 תרגיל מספר חמש: פולינומים... 131 6.8.6 תרגיל מספר חמש: מציאת ערך המצוי בכל שורות מערך... 133 7 פונקציות... 135 7.1 דוגמות ראשונות... 135 7.1.1 דוגמה ראשונה לשימוש בפונקציה: זימון פונקציה, ביצועה, וחזרה ממנה... 135 7.1.2 דוגמה שניה לשימוש בפונקציה: פונקציה הכוללת משתנים לוקליים... 137 7.1.3 דוגמה שלישית: משתנים גלובליים (כאמצעי תקשורת בין התכנית הראשית לפונקציה)... 138 7.1.4 דוגמה רביעית: פרמטרים לפונקציה (באמצעותם התכנית הראשית והפונקציה יכולות לתקשר) 139 7.1.5 דוגמה חמישית: שימוש פרמטרי הפניה parameters) (reference... 141 7.1.6 דוגמה שישית: פונקציה המחזירה ערך... 143 7.1.7 דוגמה שביעית: פונקציה עם פרמטר משתנה, המחזירה ערך... 145 7.2 פונקציות הכוללות לולאות... 147 7.2.1 פונקציה המחזירה את סכום מחלקיו של מספר... 147 7.2.2 פונקציה הבודקת האם מספר ראשוני או פריק... 148 7.2.3 פונקציה הבודקת האם מספר הוא פלינדרום... 15 7.3.1 פונקציה המחזירה את הערך המרבי המצוי במערך... 151 7.3.2 פונקציה המחזירה את הערך הזוגי המרבי המצוי במערך... 152 7.3.3 פונקציה הקוראת נתונים לתוך מערך (גרסה א')... 153 7.3.4 פונקציה הקוראת נתונים לתוך מערך (גרסה ב')... 154 7.3.5 פונקציה המקבלת מערך דו-ממדי (רב ממדי)... 155 7.3.6 העברת תא במערך כפרמטר לפונקציה... 157 7.5 שימוש בפונקציות לכתיבת תכניות מודולאריות... 159 7.5.1 תכנית להצגת שורשי משוואה ריבועית... 161 7.5.2 משחק החיים... 166 7.6 מחסנית הזיכרון... 171 7.7 חוקי ה-... scope 177 179... Overloading 7.8 7.9 תרגילים... 18 8 7.9.1 תרגיל מספר אחד: איתור גרם מדרגות מרבי במערך... 18 7.9.2 תרגיל מספר שתיים: איתור מטוס מרבי במערך... 181 7.9.3 תרגיל מספר שלוש: איתור תולעת מרבית במערך... 182 7.9.4 תרגיל מספר ארבע: איתור ריבועי קסם במערך... 183 7.9.5 תרגיל מספר חמש: איתור מסגרת במערך... 183 7.9.6 תרגיל מספר שש: איתור סולם מרבי במערך... 184 7.9.7 תרגיל מספר שבע: איתור תת-מטריצות סימטריות במטריצה... 184 רקורסיה... 185 8.1 דוגמות ראשונות... 185 8.1.1 8.1.2 8.1.3 8.1.4 8.1.5 8.1.6 8.2.1 חישוב n! 186 חישוב סכומם של שני מספרים טבעיים... 193 חישוב החזקה של שני מספרים טבעיים... 195 תרגום מספר טבעי מבסיס 1 לבסיס... 2 197 קריאת סדרת מספרים באורך לא ידוע, והדפסתם בסדר הפוך... 198 הצגת האיבר ה- n י בסדרת פיבונאצ'י... 199 8.2 מיון מהיר Sort)...(Quick 25 8.3 מגדלי האנוי זמן הריצה של מיון מהיר... 29 212... (Towers of Hanoi) 8.3.1 8.3.2 8.3.3 8.3.4 8.4.1 תיאור הבעיה... 212 הסבר אינטואיטיבי של הפתרון... 212 תיאור אלגוריתמי של הפתרון... 214 זמן הריצה של האלגוריתם... 219 8.4 בעיית שמונה המלכות... 221 זמן הריצה האלגוריתם... 231 8.5 איתור מסלול יציאה ממבוך... 233 8.6 חלוקת קבוצה לשתי תת-קבוצות שקולות... 24 8.7 תרגילים... 247 8.7.1 תרגיל מספר אחד: תכניות רקורסיביות פשוטות... 247 1

9 9.1 9.2 9.3 8.7.4 תרגיל מספר ארבע: סידור כרטיסים בתבנית רצויה... 249 8.7.5 תרגיל מספר חמש: מילוי תשבץ במילים... 25 8.7.6 תרגיל מספר שש... 251 8.7.7 תרגיל מספר שבע: התאמת תבניות Matching) (Pattern... 252 8.7.8 תרגיל מספר שמונה: איתור מסלולים במערך... 252 8.7.9 תרגיל מספר תשע: איתור תולעים במערך... 254 8.7.1 תרגיל מספר עשר: מסעי הפרש... 254 8.7.11 תרגיל מספר אחת-עשרה: תמורות... 255 8.7.12 תרגיל מספר שתיים-עשרה: מגדלי האנוי עם טבעות ורודות וירוקות... 255 8.7.13 תרגיל מספר שלוש-עשרה: כמות העבודה הנדרשת בעת העברת מגדלי האנוי... 255 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.3.6 9.3.7 משתנים תוויים (chars) ומחרוזות...(strings) 256 משתנים תוויים... 256 מחרוזות... 261 תרגילים... 274 תרגיל מספר אחד: הורדת תיעוד מתכנית, וספירת מילים המופיעות בה... 274 תרגיל מספר שתיים: ספירת מילים בטקסט... 274 תרגיל מספר שלוש: הצפנת ופיענוח טקסט... 274 תרגיל מספר ארבע: מספרים גדולים... 275 תרגיל מספר חמש: התאמה חלקית של מחרוזות... 275 תרגיל מספר שש: פלינדרום מקסימלי... 276 תרגיל מספר שבע: חילוץ מספרים מטקסט... 276 1 קלט פלט וטיפול בקבצים בשפת ++C... 278.1.1 הקדמה... 278 1.2 הפונקציה...cin.eof() 279 1.3 הפונקציות cin.fail() וחברותיה... 281 1.4 שימוש בקבצים חיצוניים... 283 1.5 מצביעי get ו-... put 289 1.6 קריאה וכתיבה מאותו קובץ... 292 1.7 תרגילים... 294 1.7.1 תרגיל מספר אחד: מיזוג קבצים.... 294 1.7.2 תרגיל מספר שתיים: דחיסת נתונים... 295 11

ב( 1. הקדמה פרק זה כשמו כן הוא: פרק הקדמה. מטרתו ללמד אתכם מעט אודות המכונה בה תשתמשו במהלך לימודיכם: המחשב. יאמר מיד, כשם שאתם יכולים לנהוג במכונית, או לתפעל מכונת כביסה, בלי להכיר כלל את עקרונות פעולתם של אותם מכשירים, כך אתם יכולים גם לתפעל את המחשב בלי להבין כיצד הוא פועל; אולם לדעתי יועיל לכם להבין, ולו באופן כללי ועל קצה המזלג, כיצד פועל המחשב, מדוע אתם מבצעים צעד זה או אחר, ול מה אותו צעד גורם במחשב. על-כן בחרתי לפתוח את מסענו בהסבר קצר וכללי אודות המחשב. אני מודע לכך שמי שהיכרותו עם עולם המ ח שוב התמצתה עד היום בתפעול מכשיר בנק אוטומטי או בשימוש במעבד תמלילים, עלול, בשלב זה, שלא להבין חלק מהדברים, על כן אני ממליץ לכם לקרוא פרק זה עתה, אך לשוב אליו אחרי שתצברו ניסיון מסוים בתפעול המחשב ובת כנותו. אני תקווה כי מה שלא יובן עתה יובן אז בצורה מלאה יותר. נפתח בשאלה: מהו המחשב? במה הוא שונה ממכונת הכביסה (ודומה, אולי, ללגו)? ביסודו כמכשיר אבסטרטי מורכב המחשב משני מרכיבים א. זיכרון,memory) ולעיתים נדייק ונאמר זיכרון ראשי main memory כדי להבדיל בין הזיכרון הראשי לזיכרון המשני), ב. מעבד processor) ולעיתים נדייק ונאמר מעבד ראשי או Central Processing Unit ובקיצור.CPU ללשון הדיוק נזדקק עת נרצה להבחין בין המעבד הראשי למעבדי עזר נוספים שעשויים להיות מותקנים במחשב). כדי להפוך את המכשיר האבסטרקטי לפרקטי, יחוברו למחשב רכיבי ציוד היקפי device) (peripheral נוספים כגון מקלדת, מסך, דיסק קשיח disk),(hard כונן תקליטונים, עכבר, מדפסת. ברכיבים אלה נדון בהמשך שכן הם חיוניים לשם תפעולו של המחשב, אולם הם אינם חלק מהמחשב ביסודו, במובנו הצר ביותר. הזיכרון 1.1 הזיכרון כשמו כן הוא: תפקידו לזכור (במילים אחרות: לשמור) את מה שאוחסן בו. הזיכרון שומר את מה שאוחסן בו רק כל עוד המחשב פועל (עת מכבים את המחשב תוכנו של הזיכרון אובד). מה הזיכרון זוכר? לא זיכרונות ילדות, אלא: (א) נתונים (data) כגון המספר 17, או השם 'יוסי כהן', ( תכניות :(programs) תכנית היא סדרה של פקודות (statements) המוב נות למחשב, כגון: (1) חבר את המספרים 3879 ו- 17, (2) שמור את הסכום בזיכרון, (3) הגדל את הסכום באחד, (3) אם הסכום אינו מתחלק ב- 121 אזי אפּ ס (הכנס אפס) את תא הזיכרון בו שמרת את הסכום. הזיכרון אינו יודע לעשות דבר עם הנתונים והתכניות השמורים בו פרט לשמירתם. המחשבים בהם אנו משתמשים כיום נקראים מחשבי פון-נוימן, על-שם האדם שהגה אותם. אחד הרעיונות שהגה פון-נוימן הוא שאותו זיכרון עשוי להחזיק שני סוגים של 'יצורים': תכניות ונתונים (שישמשו את התכניות). כאשר אנו, כבני אדם המורגלים בשימוש במספרים עשרוניים, חושבים על התא הבסיסי ממנו נרכיב מערכת לשמירת מספרים, סביר שנחשוב על תא שעשוי להכיל ספרה עשרונית (כלומר ספרה שעשויה להכיל ערך שבין אפס לתשע). באמצעות שני תאים כאלה נוכל לשמור מספרים בתחום שבין אפס ל- 99, באמצעות שלושה תאים נוכל לשמור מספרים שבין אפס ל- 999 וכך הלאה. במחשב היחידה הבסיסית ממנה בנוי הזיכרון היא תא יחיד הקרוי סיבית (bit) ואשר מסוגל להכיל אחד משני 12

ערכים: אפס או אחד, במילים אחרות ערך בינארי. באמצעות שתי סיביות נוכל לשמור ארבעה ערכים שונים (, 11), 1, 1, באמצעות שלוש סיביות נוכל לשמור שמונה ערכים שונים (שעשויים לייצג את המספרים אפס עד שבע, האותיות א' עד ח', או כל שמונה ערכים שנרצה). באמצעות שמונה סיביות נוכל לשמור 256 ערכים שונים. קבוצה של שמונה סיביות מכונה בית.(byte) שני בתים (או לעתים ארבעה או שמונה בתים) מכונים מילה.(word) מכיוון שסיבית בודדת היא יחידה קטנה מאוד, נהוג לציין את גודלו של הזיכרון ביחידות של בתים (גודלו של הזיכרון ביחידות של סיבית הוא, כמובן, פי שמונה מגודלו ביחידות של בית). על הזיכרון ניתן לבצע אחת משתי פעולות: (א) לאחסן ערך בתא זיכרון כלשהו (במילים אחרות לכתוב ערך על התא), או (ב) לשלוף את הערך המצוי בתא זיכרון כלשהו (הקריאה\שליפה אינה מוחקת את הערך המצוי בתא). זיכרון המחשב כולל מילארדי בתים. על-מנת שניתן יהיה לפנות לבית רצוי כלשהו בזיכרון, (כדי לכתוב עליו או על מספר בתים רצופים המתחילים בבית זה, או כדי לקרוא את הערך המצוי בתא הזיכרון), נותנים לכל בית בזיכרון כתובת. לפיכך, לדוגמה, תכנית במחשב עשויה לכלול פקודה אשר מכניסה את הערך 17 לתא המצוי בכתובת 38789 בזיכרון. במחשבים האישיים המיוצרים בעת כתיבת שורות אלה, גודלו של הזיכרון הראשי נע בין 512 mega byte (כלומר 512 מיליוני בתים) לבין 4 giga byte (כלומר ארבעה מיליארדי בתים) לערך. המעבד 1.2 המעבד הוא המוח של המחשב, הוא זה שיודע לבצע,execute) לעיתים נאמר להריץ (run את התכניות השמורות בזיכרון. עת המעבד מריץ תכנית, ועל-ידי כך מבצע משימה כלשהי, אנו אומרים כי המחשב ביצע חישוב (computation) זה או אחר. בשפת יומיום חישוב משמש בה ק שר המתמטי, בעולם המחשבים חישוב מציין כל משימה שתורגמה לתכנית מחשב, (במילים אחרות שתוכנתה), ושמבוצעת על-ידי המחשב (דוגמה לחישוב: קרא מהמשתמש סדרה של מילים באנגלית, מיין את המילים על-פי סדר לקסיקוגרפי, כלומר על-פי הסדר בו הן מופיעות במילון, ואחר הצג את המילים הממוינות). אמרנו שהמחשב (או ליתר דיוק המעבד שבו) מבצע תכנית, כלומר סדרה של פקודות. גדולתו של המחשב היא שהפקודות הבסיסיות אותן מכיר המעבד (ומסוגל לבצע) הן פשוטות ביותר, אך על-ידי שילובן יחד ניתן לבצע משימות מורכבות ביותר. בכך דומה המחשב ללגו. גם בלגו קיימות מספר קוביות קטנות ופשוטות אשר על-ידי הרכבתן יחד ניתן לבנות מבנים באופן שרק השמים (והתקציב) הם הגבול (תרתי משמע). בכך שונה המחשב ממכונת הכביסה: במכונת הכביסה קיימות מספר תכניות מוגדרות וקבועות מראש, ואתם אינכם יכולים לבנות לכם תכנית כבקשתכם אשר תכניס מים, תשטוף, תסחט בכל סדר שהוא וכמה פעמים שאתם רוצים. את מהירות המעבד נהוג למדידות ביחידות של הרץ. מהירות המעבד במחשבים הביתיים המיוצרים כיום היא כ- 7 מגה הרץ (כלומר שעון המעבד מבצע 7 מיליון פעימות בשניה). קיים קשר עקיף בין מהירות זאת לבין מספר הפקודות בשפת מכונה שהמעבד מסוגל לבצע, ולכן יהיה זה מדויק אך בחלקו לומר שמעבד 13

שמהירותו X מבצע תכנית כלשהי מהר יותר ממעבד שני שמהירותו Y (עבור < Y.(X 1.3 שפת מכונה, שפת הרכבה, ושפה עילית הפקודות אותן המעבד יודע לבצע נקראות שפת המכונה language) (machine של המחשב. תכוּנוֹתיה של שפת המכונה הן: (א) היא מורכבת ממספר מוגבל של פקודות בסיסיות\פשוטות. (ב) היא ספציפית לכל מעבד ומעבד (שפת המכונה של מעבדים המיוצרים על-ידי חברה X (לדוגמה אינטל) שונה משפת המכונה של מעבדי חברת Y (לדוגמה: מוטורולה)). (ג) פקודותיה מקודדות כאפסים ואחדים (על-מנת שנוכל לשמרן בזיכרון). פקודה אפשרית בשפת מכונה עשויה להראות באופן הבא: 11 1 11 (הרווחים הוכנסו רק כדי להקל עלינו כבני אדם את הקריאוּת), ומשמעותה עשויה להיות: שלוש הסיביות השמאליות (11) מציינות שיש לחסר את הנתון המופיע בכתובת שבחמש הסיביות הבאות (1 כלומר כתובת מספר 1) מהנתון המופיע בחמש הסיביות שאחר-כך (11 או הכתובת מספר 5). כתיבת תכניות המורכבות מפקודות כנ"ל היא משימה המועדת לטעויות מרוּבות (לדוגמה: בהיסח הדעת יזין המתכנת 11 במקום 11 בתור מציין הפקודה שיש לבצע, והתוצאה תהיה שהמחשב יבצע פקודה שונה מפקודת החיסור אליה התכוון המתכנת). על-כן באו חכמים והגו את שפת ההרכבה language).(assembly פקודותיה של שפת ההרכבה זהות לאלה של שפת המכונה, אולם במקום לכתוב ס דרות של אפסים ואחדים (כפי שכותב המתכנת בשפת המכונה) כותב המתכנת בשפת ההרכבה פקודות בשפה מילולית. לדוגמה את הפקודה שתיארנו קודם לכן בשפת מכונה נכתוב בשפת הרכבה כ-,#1 #5 SUB כלומר החסר (subtract) את הנתון בכתובת מספר 1, מהנתון בכתובת מספר 5. תכנית הכתובה בשפת הרכבה אין המעבד מסוגל לבצע (זו אינה תכנית בשפת מכונה). כדי שהמעבד יהיה מסוגל לבצע את התכנית יש ראשית לתרגמה משפת הרכבה לשפת מכונה. את פעולת התרגום עושה תכנית במחשב בשם מרכיב.(assembler) שימו לב כי המרכיב מבצע עבודת תרגום די פשוטה, לדוגמה הוא מתרגם מילה כגון SUB לרצף של אפסים ואחדים כגון 11, את המספר העשרוני 5 עליו לתרגם למספר הבינארי 11, וכך הלאה. אין ספק כי תיכנות בשפת הרכבה נח הרבה יותר מאשר תכנות בשפת מכונה, אולם גם לשפת ההרכבה יש מספר חסרונות מהותיים: (א) היא מורכבת מפקודות שאינן די תואמות את דרך החשיבה של מתכנת אנושי, ועל כן התכנות בה פחות נח מכפי שהינו מעוניינים. (ב) מכיוון שפקודותיה זהות לאלה של שפת המכונה היא תלויית מעבד; מש מ ע איננו יכולים להעביר תכנית שכתבנו בד י עמל בשפת הרכבה של מחשב אחד, למחשב אחר בו מותקן מעבד שונה ('הדובר' שפת מכונה, ולכן גם שפת הרכבה שונה), וזו כמובן מגבלה מאוד משמעותית בעולם כה דינמי כמו עולם המחשבים. על שתי המגבלות הללו מתגברות (חלקית) השפות העיליות. שפה עילית היא שפה שפקודותיה נהגו בדמיונו הקודח של מפתח השפה. פקודות השפה אינן קשורות למחשב זה או אחר, והסיבה להכללתן בשפה היא שלדעת מפתח השפה כתיבת תכניות תוך שימוש בפקודות אלה תהיה משימה יחסית נוחה, באשר הפקודות תואמות את צורת החשיבה של מתכנת אנושי עת האחרון מעוניין לכתוב תכנית מחשב. קריטריון נוסף אותו מפתח שפה ישקול הוא המידה בה התכנית תהיה קריאה לאדם אחר מזה שכתב אותה. על כן פקודות בשפה עילית 14

נראות דומות במידת מה למשפטים בשפה האנגלית. לדוגמה הפקודה: (y if x) > write(x) then משמעה שאם תא הזיכרון המכוּנה בשם x מכיל ערך גדול מהערך המוחזק בתא הזיכרון המכונה y, אזי הצג את ערכו של תא הזיכרון x. מתכנן שפה ישקול גם את המידה בה ניתן יהיה לתרגם בקלות וביעילות תכנית הכתובה ב שפה אותה הוא מפתח לשפת מכונה. לכאורה, אפשר היה להציע שהמתכנת יכתוב את תכניתו באנגלית ציחה, אולם אז יש קרוב לודאי שתרגום התכנית לשפת מכונה היה משימה בלתי אפשרית. על כן מפתח של שפה עלית צריך לשמור על מתח בין רצון לפתח שפה בה נקל יהיה לכתוב, לבין היכולת לתרגם תכנית בשפה אותה הוא מפתח לשפת מכונה (שהיא, ורק היא, השפה אותה 'דובר' המעבד). כמעט כל התכניות הנכתבות בימינו מתוכנתות בשפות עליות כגון פסקל, ++C, C,,Java בייסיק, קובול, ורבות אחרות. כמובן שתכנית הכתובה בשפה עילית אינה ניתנת לביצוע (להרצה) כמות שהיא על-ידי המעבד (שכן היא אינה כתובה בשפת מכונה). כדי שהמעבד יוכל לבצע את התכנית יש, ראשית, לתרגמה לשפת מכונה. פעולת התרגום משפה עילית לשפת מכונה נעשית על-ידי תכנה במחשב הנקראת מהדר או קומפיילר (compiler) ובת זוגה הנקראת כורך או לינקר.(linker) הקומפיילר מתרגם את פקודות התכנית כפי שכתב המתכנת (בשפה עילית) לשפת מכונה. אנו אומרים כי הקומפיילר תירגם את תכנית המקור program) (source לקוד code) ולעיתים נדייק ונאמר.(object code בעגה אנו אומרים כי קימפלנו את התכנית (או שהקומפילר קימפל את התכנית). אולם הקוד המתקבל אינו שלם עדיין, ואינו ניתן להרצה (לביצוע) על-ידי המעבד. את השלמת התהליך לכדי תכנית ניתנת להרצה מבצעת תוכנת הלינקר. הלינקר מוסיף לקוד המתקבל נדבכים נוספים, שעל מהותם לא נעמוד בקורס זה, ויוצר תכנית ניתנת להרצה ) executable.(code את התכנית הניתנת להרצה יוכל המעבד לבצע. במקרים רבים איננו מדייקים בלשוננו ואנו משתמשים בביטוי לקמפל עבור התהליך המלא של קומפילציה ולינקינג. ציינו כי שפת ההרכבה קשורה לשפת המכונה. שפה עילית אינה קשורה לשפת המכונה, רק הקומפיילר הוא שקושר בין התכנית הכתובה בשפה עילית למעבד זה או אחר. על-כן את אותה תכנית נוכל לתרגם באמצעות קומפיילר א' לשפת מכונה של מחשב #1, ובאמצעות קומפיילר ב' לשפת המכונה של מחשב #2. התוצאה היא שהתכנית הפכה להיות נשיאה (portable) במובן זה שניתן לשאת אותה, במילים אחרות להעביר אותה, ממחשב למחשב; ועת אנו עוברים ממחשב למחשב אין צורך לכתוב מחדש את כל התכניות שכתבנו על המחשב הישן. יש צורך רק בכתיבת תוכנות קומפיילר ולינקר חדשות, ובאמצעות תכנות אלה נוכל לתרגם את כל התכניות שכתבנו בשפה עילית למחשב החדש. לקומפיילר תפקיד נוסף מ עבר לת רגום התכנית משפה עילית לשפת מכונה: במידה ובמהלך התרגום מאתר הקומפיילר שגיאות בתכנית המקור, הוא מודיע על-כך ואינו מבצע את התרגום. לדוגמה אם במקום לכתוב if יכתוב המתכנת בטעות,iif אזי הקומפיילר יתקל, מבחינתו, בפקודה שגויה בתכנית. הוא לא ינסה לנחש מה הייתה כוונת המתכנת, אלא הוא יודיע כי הוא איתר שגיאה בתכנית. בשפת C עשוי הקומפיילר גם להזהיר אתכם על פקודות 'חשודות' בתכנית. אזהרות שכאלה לא תמנענה מהקומפיילר לתרגם את התכנית לשפת מכונה, ובכל אופן ראוי שהתכניות שתכתבו לא 'תזכנה' לאזהרות מצד הקומפיילר. 15

1.4 האדיטור, והדיבגר הזכרנו כי המחשב מורכב מזיכרון ומעבד. התכניות שנכתוב במחשב שוכנות (בשלב ראשון) בזיכרון. התוכנה במחשב אשר מאפשרת לנו לכתוב תכניות, כלומר להזין את התכנית שכתבנו על דף, לזיכרון המחשב נקראת עורך או אדיטור (editor) בלע"ז. האדיטור דומה למעבד תמלילים, אולם הוא מותאם במיוחד ורק לכתיבת תכניות, ככזה אין בו חלק מהכלים שקיימים במעבד תמלילים (באדיטור אין אפשרות להקליד אותיות דגושות למשל או לקבוע גופן כזה או אחר) ומנגד יש בו עזרים אשר מסייעים להקלדת התכנית באופן נח (לדוגמה: הוא צובע מילות מפתח שונות בצבעים שונים, מעמ ד את התכנית באופן המקובל). באמצעות האדיטור נקליד את התכנית שכתבנו (בשפה עילית), אחר באמצעות הקומפיילר והלינקר נתרגם את התכנית לשפת מכונה, ואז יוכל המעבד להריצה. כלי נוסף שעומד לרשות המתכנת הוא המנפה.(debugger) הדיבגר מסייע לכם לאתר שגיאות בתכנית. קודם ציינו כי במידה והקומפיילר מאתר שגיאות בתכנית הוא אינו מתרגם את התכנית לשפת מכונה. עתה נדייק ונאמר כי המהדר מאתר שגיאות תחביריות (כדוגמת החלפת if ב-,iif או העדרו של פסיק במקום בו הוא מצוּפה להופיע). לעיתים התכנית עשויה להיות חפה משגיאות תחביריות, על-כן הקומפיילר יוכל לתרגמה לשפת מכונה, אולם התכנית תכלול שגיאות לוגיות, כלומר שגיאות אשר גורמות לתכנית שלא לבצע את המשימה אותה היא אמורה לבצע. לדוגמה, נניח כי על התכנית לחבר את ערכם של תא הזיכרון המכונה בשם x עם תא הזיכרון המכונה y, אולם המתכנת, בהיסח הדעת, במקום לכתוב x+y כתב.x-y מבחינה תחבירית התכנית תקינה, ועל כן הקומפיילר יצליח לתרגמה לשפת מכונה, אולם עת התכנית תורץ היא לא תבצע את מה שהיה עליה לבצע. אנו אומרים כי התכנית כוללת שגיאה לוגית. סוג מיוחד של שגיאה לוגית היא שגיאה אשר גורמת למחשב להפסיק את ביצוע התכנית, שכן התכנית מנסה לבצע פעולה אסורה או בלתי אפשרית. לדוגמה נניח כי המתכנת כלל בתכניתו פקודה כגון x/y שמשמעה חלק את הערך המצוי בתא הזיכרון שכינויו x בערך המצוי בתא הזיכרון שכינויו y. עוד נניח כי מסיבה כלשהי תא הזיכרון y כולל את הערך אפס. עת המחשב (ליתר דיוק המעבד) ינסה לחשב את המנה (תוצאת החילוק), הוא ייכשל, שהרי לא ניתן לחלק באפס. המחשב יפסיק מיידית את ביצוע התכנית ויודיע כי ביצוע התכנית נקטע בשל שגיאה. אנו נוהגים לומר במקרה כזה כי התכנית עפה.(aborted or terminated) 1.5 הדיבגר מאפשר לכם להריץ תכניות בצורה מודרכת, לבצע בכל פעם רק פקודה יחידה, להציג את ערכם של תאי זיכרון שונים, וכך לאתר את המקום בו התכנית שוגה. במקרים רבים קיימת במחשב תכנה יחידה הנקראת סביבת עבודה ואשר כוללת את כל הכלים להם אנו נזקקים לשם כתיבת תכניות, כלומר אדיטור, קומפיילר, לינקר, ודיבגר.,borland C,Microsoft Visual Studio, Eclipse, Anjuta או Borland Project הן כמה דוגמות לסביבות עבודה. מערכת ההפעלה מחשב המורד מפס היצור נקרא מכונה עירומה, יש לו את כל הרכיבים הדרושים, אולם אין מי שיארגן את הרכיבים הללו לכדי מערכת אחת שלמה, אינטגרטיבית, בה ניתן לעשות שימוש מועיל. את הארגון והפיקוח על פעולת הרכיבים השונים מבצעת תכנה במחשב הקרויה מערכת ההפעלה system).(operating מערכת 16

ההפעלה היא שמאפשרת לכם להשתמש במחשב באופן שתקבלו ממנו את שאתם צריכים, ולא תגרמו נזקים לנתונים ולתכניות השמורים בו. עם הדלקת המחשב פונ ה המעבד להרצת מערכת ההפעלה, ולכל אורך פעולת המחשב מערכת ההפעלה היא שמוֹר ה למעבד מה עליו לעשות בכל שלב, היא שמאפשרת לו להריץ תוכנה זו או אחרת אותה אתם מבקשים להפעיל. היא גם שמפקחת שהפעלתה של התכנה (במלים אחרות, שהרצתה על-ידי המעבד) לא תגרום לנזקים (למשל שהתכנה לא תנסה לכתוב על תאים בזיכרון עליהם אין היא אמורה לכתוב ). כל תכנית המורצת במחשב, בין אם זה מעבד תמלילים משוכלל, ובין אם תכנית קטנה שאתם כתבתם, מורצת בפיקוחה של מערכת ההפעלה. מערכת ההפעלה כוללת מרכיבים רבים. לדוגמה עת תכנית נזקקת לזיכרון במחשב מערכת ההפעלה היא שמקצה את קטע הזיכרון שיעמוד לרשות אותה תכנית (וכך דואגת מערכת ההפעלה שתכניות שונות תקבלנה קטעי זיכרון שונים, ועל-כן לא תפרענה אחת לשניה). עת תכנית מעונינת להדפיס נתונים מערכת ההפעלה היא זו שבפועל מעבירה את הנתונים הדרושים למדפסת (מערכת ההפעלה תדאג לכך שאם שתי תכניות בקשו להדפיס בו זמנית אזי ראשית יודפסו נתוני התכנית האחת ורק אחר נתוני התכנית השניה). מערכת ההפעלה היא שאחראית לקרוא מהמקלדת את שמוקלד עליה (ולהעביר את המידע שמוקלד ל תכנית שזקוקה לו), והיא שמעבירה למסך את הנתונים שתכנית המורצת במחשב מעוניינת להציג על המסך. מערכת ההפעלה תדאג שהפלט של כל תכנית יופיע במסך במקום המתאים. בקיצור כל מלאכת ניהול המחשב והפיקוח על שקורה בו מסור בידיה הנאמנות(?) של מערכת ההפעלה. 1.6 ציוד המתחבר למחשב עד כה תיארנו את המחשב כמורכב מזיכרון ומעבד. אלה הם המרכיבים הבסיסיים של המחשב כמכשיר אבסטרקטי; אך עת רוצים שהמחשב יהיה גם מכונה פ רק טית יש לחבר לו מרכיבים נוספים, כפי שכולכם מכירים, מרכיבים הנקראים ציוד קלט פלט ) device input output או בקיצור (i/o device או ציוד היקפי: המסך (ולעיתים רמקולים המחוברים למחשב) מאפשרים הצגת נתונים (במובן הרחב של המילה), המקלדת והעכבר מאפשרים הזנת נתונים. מרכיב חשוב בציוד הקלט פלט הוא הזיכרון המשני המורכב במקרים רבים מהדיסק הקשיח disk) (hard, התקליטון\דיסקט,(diskette) או זיכרון נייד כדוגמת.disk on key ציינו כי הזיכרון (או ליתר דיוק הזיכרון הראשי) שומר את הנתונים הנכתבים עליו רק כל עוד המחשב דולק. במקרים רבים אנו מעונינים לשמור נתונים לאורך זמן, גם עת המחשב מכובה (לדוגמה: כתבנו תכנית מחשב חשובה או חיברנו יצירת מופת). מספר רכיבי ציוד מאפשרים שמירת נתונים גם עת המחשב כבוי; החשובים ביניהם הם הדיסק הקשיח והזיכרון הנייד. עקרונית דרך פעולתם של שני כלים אלה זהה. (דיסקטים, סרטים מגנטיים, הדומים לקלטות במכשירי הקלטה, ותקליטים אופטיים,,compact disks הם כלים נוספים המאפשרים שמירת נתונים גם עת המחשב אינו פועל). מבחינתנו כמשתמשים, ההבדל המשמעותי בין הדיסק הקשיח לתקליטון או ל- disk on key הוא שהדיסק הקשיח מותקן בדרך כלל ב מחשב באופן קבוע, ולא ניתן לשאתו ממקום למקום בנפרד מהמחשב בו הוא מותקן, לעומתו את התקליטון ניתן להתקין במחשב (להכניסו לכונן התקליטונים), לכתוב עליו או לקרוא ממנו את המידע הרצוי, ואחר לנתקו מהמחשב, ולשאתו עמכם לכל מקום אליו תפ נו. הבדל 17

נוסף הוא שתהליך הכתיבה על גבי הדיסק הקשיח והקריאה ממנו מהירים יותר מאשר ביצוע אותן פעולות על גבי תקליטון. כמו כן נפחו של הדיסק הקשיח גדול מזה של תקליטון. נפחו של תקליטון המיוצר כיום הוא כ- 1.5 במחשב ביתי הוא בסדר גודל של מאתיים בתים). מגה בית, בעוד נפחו של דיסק קשיח ג'יגה בית (כלומר מאתיים מיליארד 1.7 מושג חשוב אותו עלינו להכיר עת אנו דנים בזיכרון המשני הוא הקובץ.(file) נניח שכתבנו תכנית מחשב, או להבדיל פואמה, וברצוננו לשמור את יצירתנו לאורך זמן, ולכן על-גבי דיסק (או זיכרון נייד). כדי שהמחשב (או ליתר דיוק המעבד בפיקוחה של מערכת ההפעלה) יוכל לשמור את הנתונים עבורנו, הוא מקצה על-גבי הדיסק שטח או במילים אחרות קובץ, ועליו הוא שומר\כותב את הנתונים. אנו איננו יודעים היכן מצוי השטח שהוקצה על גבי הדיסק (כלומר, מה כתובתו), כל שאנו יודעים הוא מה השם שאנו בחרנו לתת לקובץ שנוצר. לדוגמה נניח שבחרנו לקרוא לקובץ.my_poem בהמשך נוכל להורות למחשב להדפיס את הקובץ ששמו,my_poem לטעון למעבד התמלילים קובץ זה, או אפילו למחוק את הקובץ הנ"ל. המחשב ידע לאיזה קובץ אנו מתכוונים שכן לכל קובץ יש שם ייחודי המזהה רק אותו (כמובן שניסיון לקמפל את הקובץ,my_poem המכיל פואמה היסטורית דידקטית, יגרום למהדר להודיע לנו על אינספור שגיאות שהוא מצא ב-'תכנית' שביקשנו ממנו לקמפל). עת אתם כותבים תכנית חדשה במחשב, באמצעות האדיטור, התכנית ר אשית נשמרת בזיכרון. אחת הפעולות שהאדיטור מאפשר לכם לבצע היא לשמור את התכנית כקובץ בזיכרון המשני. עת תבקשו מהאדיטור לבצע פעולה זאת הוא ישאלכם לשמו של הקובץ שברצונכם ליצור ושיכיל את התכנית שכתבתם. מושג נוסף שנרצה להציג בשלב זה הוא מושג המחיצה (folder) או המדריך.(directory) נניח שאתם אנשים מסודרים. עוד נניח כי במסגרת עבודתכם אתם כותבים מכתבים, מחברים מנגינות ומציירים ציורים. על-כן סביר לצפות שבשולחן העבודה שלכם (הפיזי, הניצב בחדרכם) נמצא מגרת מכתבים, מגרה ובה מצויים תווים, ומגרה בה שוכנים ציוריכם. באופן כזה נקל יהיה עליכם לאתר 'מסמך' (דף) רצוי זה או אחר. אם תוך כדי עבודתכם מתברר לכם שאתם כותבים מכתבים רבים ואיתור מכתב רצוי בין כלל המכתבים שכתבתם נעשה קשה, סביר שתפצלו את מגירת המכתבים למגרת מכתבים רשמיים לעומת מגירת מכתבים אישיים. גם במחשב קיים מנגנון דומה. האנלוג במחשב למגרה היא המחיצה או המדריך. על-כן במחשב האוניברסיטה סביר שתימצא מחיצה לכל תלמיד. כל תלמיד יוכל לשמור במחיצה שלו, ורק במחיצה שלו, חומר שהוא יצר. אם התלמיד לומד מספר קורסים יתכן שאת המחיצה שלו הוא יחלק למספר תת-מחיצות, אחת לכל קורס (ואולי כמה מסמכים\קבצים שאינם שייכים לשום קורס ישכנו במחיצה הראשית של התלמיד, לצד מחיצות המשנה של הקורסים השונים). יתכן שאת המחיצה של הקורס מבוא לתכנות יחלק התלמיד שוב למספר מחיצות אחת עבור כל תרגיל, כך שבמחיצה של כל תרגיל ישכון כל החומר השייך לתרגיל זה (כגון קובץ הכולל את תכנית המקור שהתלמיד יצר, קובץ הכולל את תרגום תכנית המקור לשפת מכונה). שפת C הקורס שלפנינו מתנהל בשפת C או ליתר דיוק בשפת ++C. למעשה מרבית הנושאים שילמדו משותפים לשתי השפות גם יחד, ואת ההיבטים המרכזיים 18

שמייחדים את ++C מ- C (קריא תכנות מונחה עצמים) לא נכיר במהלך קורס זה. (במקומות בהם חומר הלימוד נכון רק לשפת ++C ולא לשפת C נציין זאת). ניתן לנהל דיונים ארוכים ומלומדים מדוע לבחור בשפה זו או אחרת לקורס ראשון במדעי המחשב. לצורך ענייננו נאמר בקצרה כי C היא השפה הנפוצה ביותר לתכנות מודולרי programming) (modular כפי שנלמד בקורס זה. לשפת C מגבלה עבור מתכנתים מתחילים והיא שהשפה מאוד 'ליברלית', כלומר הקומפיילרים שלה נוטים להניח שהמתכנת יודע מה הוא עושה, ועל כן אם הוא כתב דבר מה יש להניח שיש לו סיבה טובה לעשות זאת. דא עקא עבור מתכנתים מתחילים הנחה זאת לעיתים קרובות אינה תקפה---מתכנת מתחיל כותב לעיתים שטויות חסרות פשר או תכלית. התוצאה היא שהשפה (או ליתר דיוק הקומפיילר) אינו די שומר עליכם, וחובת השמירה מועברת אליכם. עבור מתכנתים מתחילים זו לעיתים חובה כבדה (מדי). שנאמר "אלוהים מרחם על ילדי הגן ". בקורס זה נלמד לתכנת בגישת התכנות המודולרי. קיימות גישות אחרות לתכנות (תכנות מונחה עצמים,,object oriented programming תכנות בלוגיקה, תכנות פונקציונלי). עבור גישות אחרות קיימות שפות אחרות שעשויות להתאים יותר או פחות משפת C (בפרט עבור תכנות מונחה עצים קיים ויכוח האם ++C או Java היא השפה המועדפת). עבור תכנות מודולרי, לכוחותינו, נראה כי C היא הבחירה המתאימה ביותר. 1.8 האלגוריתם מושג אחרון אותו נכיר במסגרת ההקדמה הוא מושג האלגוריתם.(algorithm) אלגוריתם הוא שיטה לפתרון בעיה. לדוגמה, ספר בישול או אפיה מכיל סדרת של אלגוריתמים (המכונים בדרך-כלל מתכונים) המסייעים בהכנת תבשילים ומאפים שונים (לדוגמה: מתכון להכנת ברווז בנוסח סצ'ואן). 'הבעיה' אותה פותר כל אלגוריתם ב ספר היא כיצד להכין מאכל כזה או אחר. עת אתם משתמשים במתכון כדי להכין את המאכל אתם מבצעים את האלגוריתם. בעולם המחשבים מקובל לעיתים לומר שאתם מריצים את האלגוריתם. נציג שתי דוגמות נוספות שימחישו מהו אלגוריתם: א. משוואה ריבועית היא ביטוי מהצורה: y, = a*x 2 +b*x c+ עבור a,b,c שהינם מספרים ממשיים. לדוגמה: 9 +3879*x y = 17*x 2 או y = -5*x 2 +25 הן משוואות ריבועיות. שורש המשוואה הריבועית הוא ערך ממשי שאם יוצב במקום x, אזי ערך ה- y המתאים לו יהיה אפס. רובכם ודאי זוכרים שהאלגוריתם, במילים אחרות הנוסחה, או השיטה, לאיתור זוג שורשי משוואה ריבועית היא: x 1, x 2 = [-b +- sqrt(b 2 4*a*c)]/[2*a] ב. עתה נציג אלגוריתם לבדיקה האם מספר טבעי כלשהו ראשוני. האלגוריתם הוא הבא: אם המספר הוא שתיים אזי הוא ראשוני. 1. אם המספר הוא מספר זוגי השונה משתיים אזי הוא אינו ראשוני. 2. 3. אם המספר פרדי (במילים אחרות, אי זוגי) אזי בדוק את כל המספרים אחד מהם אינו מחלק את אם אף הפרטיים הקטנים משורש המספר, 19

המספר אזי המספר ראשוני; אם לפחות אחד מהם מחלק את המספר אזי המספר פ ריק (במלים אחרות, לא ראשוני). כל אלגוריתם מורכב מסדרה של פעולות בסיסיות אותן יש לבצע כדי להשיג את המטרה הרצויה, במילים אחרות כדי לפתור את הבעיה. במתכון לבישול או אפיה הפעולות הבסיסיות עשויות להיות: הקצף, טרוף, ערבב, הוסף. כמובן שההנחה היא שמבצע האלגוריתם יודע לבצע את הפעולות הבסיסיות (לדוגמה, הוא יודע כיצד מקציפים). בעולם החישובי הפעולות הבסיסיות הן הפקודות הקיימות בשפות התכנות השונות. (במרבית שפות התכנות קיימות פקודות דומות). לדוגמה, באלגוריתם שהוצג מעל לשם בדיקת ראשוניות של מספר על מבצע האלגוריתם לדעת האם מספר הוא זוגי או פרדי, עליו להיות מסוגל לחשב שורש של מספר, כלומר לבצע פעולות שאינן לגמרי טריביאליות. המילה אלגוריתם הינה שיבוש שמו של מתמטיקאי פרסי, בן המאה התשיעית: אבו ג'עפר מחמד אל ח'ואריזמי (אל ח'ואריזמי שובש באנגלית לכדי אלגוריתם). לאורך למודיכם תכירו אלגוריתמים רבים הפותרים משימות מגוונות. בקורס זה נפתח צוהר לנושא, ע"י שנראה כיצד כותבים תכניות מחשב המשלימות משימות שונות (בשפה פורמאלית יותר אנו אומרים שהתכנית מממשת את האלגוריתם), כגון מיון של סדרת מילים או מספרים; חיפוש, במילים אחרןת בדיקה, האם מילה\מספר כלשהו מצוי במאגר מילים\מספרים. 2

2. תכניות ראשונות בפרק זה נציג מספר תכניות ראשונות, פשוטות. עבור כל תכנית נציג ראשית את הקוד שלה (כלומר, הפקודות שלה), ואחר נסבירה. 2.1 תכנית ראשונה: מבנה תכנית, ופקודת הפלט cout נציג את התכנית עמה מקובל לפתוח את המסע בעולם התכנות: #include <iostream> int main() std::cout << "Hello World" ; return() ; 2.1.1 שורת ה- main() int נדון ראשית בשורה השניה ) main() ( int שורה זאת מורה למהדר (ואחר גם למעבד) כי כאן מתחילה התכנית הראשית (main) שלנו; לצורך עניינו, בשלב זה, לא נדון בשאלה התכנית הראשית בניגוד לאיזה תכנית משנית? בשלב זה יש לנו רק תכנית ראשית, והשורה שכתבנו מציינת, כאמור, כי כאן היא מתחילה. עת המעבד יגש לבצוע התכנית (כמובן, רק אחרי שהיא תקומפל בהצלחה) הוא יתחיל את הביצוע מנקודה זאת. כל תכנית שנכתוב תכלול את השורה main(),int ותמיד ממנה יתחיל ביצוע התכנית. בשורה השניה מופיעה בין היתר המילה int שהיא קיצור של integer או מספר שלם. משמעותה המדויקת של מילה זאת תובהר רק בהמשך, כעת נסתפק באמירה כי מילה זאת אומרת שהתכנית שלנו, עת היא מסיימת לרוץ, 'מחזירה' (במילים אחרות 'מודיעה') למערכת ההפעלה (שאפשרה לה לרוץ, כלומר שהתירה למעבד לבצעה) מספר שלם המציין באיזה אופן, או מאיזה סיבה, התכנית הסתיימה (האם אחרי שהתכנית השלימה את משימתה בהצלחה? או שמא אחרי שהתכנית גילתה כי היא אינה מסוגלת להשלים את פעולתה מסיבה זו או אחרת?). הפקודה האחרונה בתכנית (; return() ( היא הפקודה באמצעותה התכנית שלנו מחזירה\מודיעה למערכת ההפעלה את הערך הרצוי, במקרה שלנו את הערך אפס. גם משמעות המושג 'להחזיר ערך' תישאר עבורנו סתומה עוד זמן מה. סוגיה נוספת בה לא נדון בקורס זה היא: האם ומה עושה מערכת ההפעלה עם הערך המוחזר? כלומר, עת התכנית מסיימת, ומודיעה למערכת ההפעלה כי היא סיימה עם הקוד אפס (שכן היא מחזירה את הערך אפס), מה משמעות הדבר עבור מ.ה.. אעיר כי מי שעובד במערכת הפעלה ממשפחת יוניקס (כדוגת לינוקס) יכול אחרי הרצת התכנית להקליד את הפקודה:?$ echo ויוצג לו הערך שהתכנית החזירה למערכת ההפעלה. עוד אציין כי הנוהג הוא שעת התכנית מסיימת בהצלחה, אחרי שהיא השלימה את משימתה, היא מחזירה את הערך אפס למערכת ההפעלה. אני נוהג לכתוב את הפקודה באופן: return(); אולם למעשה הסוגריים אינם הכרחיים וניתן לכתבה גם באופן: ;. return 21

למילים כגון,int, main, return מילים אשר מתארות פקודות של השפה אנו קוראים מילים שמורות words) (reserved או מילות מפתח words).(key הסוגרים המסולסלים בשורה השלישית פותחים את גוף התכנית, ובני זוגם שבתחתית מורים שגוף התכנית נסגר. התכנית תופיע תמיד בין זוג סוגרים מסולסלים שכאלה. רבים נוהגים לכתוב את הסוגר הפותח בסוף השורה בה מופיע main() int (במקום להקצות לו שורה נפרדת). לסיכום נאמר כי בשלב זה עליכם לזכור כי כל תכנית שלכם תיפתח בשורה: int,main() ותסתיים בשורה ; ().return מהותן המדויקת של פקודות אלה תובהר רק בהמשך. 2.1.2 פקודת הפלט cout השורה הרביעית בתכנית (; World" (std::cout >> "Hello כוללת את פקודת הפלט cout (הנהגית סי אאוט). הפקודה גורמת להצגת פלט רצוי על מסך המחשב. אחרי המילה cout מופיע זוג התווים >>. שימו לב לכיוונם (>> ו לא <<), וכן הקפידו להצמידם זה לזה בלא רווח בניהם (>> ולא < >). אחרי שני תווים אלה מופיע: World"."Hello לרצף של תווים המופיעים בין גרשיים אנו קוראים מחרוזת או סטרינג.(string) לפיכך גם: "xxx" וכן: "2X1" או: "@ %7 ללל יוסי!~ הן" מחרוזות. עת המחשב פוגש במחרוזת בפקודת פלט הוא פולט את המחרוזת כמות שהיא (ללא הגרשיים שתוחמים אותה) למסך. בסיומה של פקודת ה- cout מופיע התו נקודה פסיק (;). תו זה מורה למחשב כי הסת ימה פקודה יחידה. במקרה שלנו הסתימה פקודת הפלט, בהמשך נכיר פקודות אחרות שתסתיימנה גם הן בנקודה פסיק. שימו לב כי בסוף השורה main() int לא מופיעה נקודה פסיק שכן בשורה זאת לא מופיעה פקודה. חמשת התווים std:: המופיעים לפני המילה cout מורים לנו כי למעשה פקודת הפלט cout אינה חלק משפת ++C אלא הם חלק מ-'הספריה הסטנדרטית'. הספריה הסטנדרטית היא תוספות סטנדרטיות לשפה, אשר מגיעות יחד עם כל קומפיילר std) הוא קיצור של.(standard מבחינתנו העובדה ש- cout אינה חלק מהשפה אינה משמעותית, שכן בכל סביבת עבודה בה נוכל לעבוד ב- ++C, תמצא תמיד גם הספריה הסטנדרטית, ועל כן לנו יראה כאילו cout היא חלק משפת ++C; אולם כדי להדגיש כי cout היא למעשה חלק מספריה זאת נדרשת הכתיבה:. std::cout שימו לב כי בפקודת ה- cout כיוון החיצים הוא שמאלה: כביכול אנו 'מזרימים' את המידע אל הפלט, אל.cout בהמשך נכיר את פקודת הקלט, ובה כיוון החיצים יהיה הפוך שכן בה נזרים את המידע מהקלט אל התכנית. נניח שהתכנית שלנו היתה כוללת בנוסף לפקודה: ; World" std::cout >> "Hello פקודה נוספת, שהיתה מופיעה מיד אחרי פקודה זאת והיתה: ; "bye" std::cout << כיצד היה נראה הפלט שהיה מופיע על-גבי המסך? הפלט היה נראה כך:.Hello Worldbye כלומר המילים World ו- bye מוצגות זו אחר זו ללא רווח ביניהן. כדי להתגבר על תקלה זאת יכולנו לעשות אחד מכמה דברים: יכולנו להוסיף בתחילתו של הסטרינג הכולל את bye את התו רווח כך שהסטרינג היה נראה: bye" ". מבחינתו של המחשב רווח הוא תו ככל תו אחר, ועת הוא נכלל בסטרינג הוא מוצג על המסך כמו כל תו אחר. במקרה שלנו הצגת תו זה היתה גורמת להפרדה הרצויה (לרווח) בין המילים World ו-.bye לעומת זאת, לוּ רצינו 22

שהסטרינג bye יופיע בשורה חדשה, מתחת ל-,Hello World היה עלינו לנקוט בפתרון שונה: את הפקודה ; World" cout >> "Hello הינו משנים כך שהיא היתה נראית באופן הבא: ; std::endl cout << "Hello World" << נסביר: התווים >> שנוספו מורים שברצוננו לכלול מרכיב נוסף בפקודת הפלט, המילה endl) std::endl הוא קיצור של (end line מורה שבעקבות ביצוע פקודה זאת יש לעבור לשורה חדשה בפלט, כך שפלט נוסף, שיופיע בהמשך, יוצג בשורה חדשה. כלומר ל תוספת std::endl יש משמעות עבור פקודת הפלט הבאה (אם וכאשר זו תופיע). אתם רשאים לכלול בפקודת פלט מספר מרכיבי std::endl כפי רצונכם, כל מרכיב יגרום לקפיצת שורה בפלט. לדוגמה פקודת הפלט הבאה: std::cout << std::endl << "Hello" << std::endl << ; std::endl "World << std::endl << תבצע: הפקודה תקפוץ שורה בפלט לפני הצגת המילה,Hello תקפוץ שורה בפלט אחרי הצגת,Hello (ולכן המילה World תופיע מתחת ל- (Hello ותקפוץ שתי שורות בפלט אחרי הצגת,World רווח. כך שפקודת הפלט הבאה תופיע לא בשורה הבאה במסך אלא עם שורה כמובן שגם הכתיבה std::endl מציינת שהפקודה,endl הגורמת לקפיצת שורה, אינה חלק משפת ++C, אלא היא חלק מהתוספת הקרויה הספריה הסטנדרטית. ראינו כי עת תכניתנו כוללת כמה פקודות cout או כמה פקודות endl עלינו להקדים לכל פקודה את התחילית std::. יש בכך משהו מוגיע, אותו נשמח לחסוך לעצמנו. אציג שתי דרכים לעשות זאת: אחת ראויה, והשניה נפוצה אך מאוד לא מומלצת. הדרך הראשונה היא להוסיף לתכנית, בין שורת ה- #include לשורת ה- main() int שורות נוספות: using std::cout ; using std::endl ; בכך אנו מורים לקומפיילר כי בהמשך נשתמש בפקודות cout ו- endl הנכללות בספריה הסטנדרטית, ועליו להבין זאת. בגוף התכנית נכתוב: ; endl cout <<"hi" << endl << "bye" << כלומר כבר איננו מקדימים ל- cout ול- endl את התחילית std::. אדגיש כי עבור כל פקודה בספריה הסטנדרטית בה ברצוננו להשתמש עלינו להוסיף שורת using מעל שורת ה- main(). int (אך אל דאגה לא מדובר בכמות רבה מאוד של תוספות כאלה.) פתרון שני שיחסוך לנו את הכתיבה std:: לפני כל פקודה, אולם שנחשב ע"י המהדרין לקלוקל, ועל-כן לא לגיטימי בקורס זה, הוא לכתוב מעל ה- int main() את השורה הבודדת: std;. using namespace בכך אנו מורים לקומפיילר כי נשתמש באופן חופשי בכל הפקודות הנכללות בספריה הסטנדרטית (במילים אחרות במרחב השמות הסטנדרטי); לא נצהיר על כל אחת ואחת מהפקודות בנפרד, ועליו להבין זאת. לצערי, בדוגמות רבות שתפגשו בספרים או ברשת תמצאו צורת כתיבה זאת. הסיבה היא שנוח מאוד להשתמש בה, והיא חוסכת עבודה, אולם כאמור היא נחשבת למאוד לא רצויה. ברמת הסיסמות אומר שהיא נחשבת בגדר 'זיהום של מרחב השמות'. מכיוון שמשפט זה לא באמת יכול להיות מובן לנו בשלב זה של חיינו, אזי אנו נוותר בגדר ה-'נעשה ונשמע' (בעיקר כדי שלא נולקה ע"י בודק התרגילים): במקומותינו לא משתמשים בשורה: using std; namespace נקודה! 23

מי מכם שיראה תכניות ישנות יותר בשפת ++C ימצא בהן את הפקודה: #include <iostream.h> במקום את הפקודה: #include <iostream> זוהי צורת כתיבה ישנה יותר, שכיום אינה מקובלת. עת השתמשו בצורת הכתיבה הישנה גם לא נדרשה ההתעסקות עם std כפי שתוארה מעל: לא היה צורך לכלול בתכנית לא פקודות,using ולא לציין. std::cout אולם, כאמור, צורת כתיבה זאת כבר עברה מין העולם. פקודת הפלט cout קיימת רק ב- תוסבר כאן.,C++ בשפת C קיימת הפקודה printf אשר לא <iostream>) (#include שורה זאת 2.1.3 שורת ה- #include נדון עתה בשורה הראשונה בתכנית: תשאר עבורכם לאורך קורס זה כמעין מנ ט רה שאתם כותבים בתחילת כל תכנית בלי להבין למה. את מהותה המדויקת של הפקודה תלמדו רק בהמשך. באופן כללי נאמר כי לולא כללנו שורה זאת בתכנית לא היה הקומפילר מכיר את פקודת ה- cout והיה צועק עלינו שאנו כוללים בתכנית פקודה שגויה. בשפת C (בניגוד ל- ++C) היינו, כאמור, משתמשים בפקודת הפלט,printf ולצורך השימוש בה היינו מבצעים include לא ל-,iostream אלא ל-.stdio.h פקודת ה- include הייתה נכתבת באופן זהה. 2.1.4 עימוד שימו לב כי את כל התכנית אנו כותבים באות קטנה.(lowercase) שפת C מ בחינה בין אותיות קטנות לגדולות, ולכן לו כתבנו MAIN() INT או main() Int ב מקום main() int זו היתה שגיאה. נושא נוסף עליו יש לתת את הדעת הוא העימוד (הזחה, אינדנטציה.(indentation שפת C מאפשרת לכם פורמט חופשי, כלומר אתם רשאים לכתוב את תכניתכם על הנייר\מסך באיזה מיקום שתחפצו, ולקומפיילר זה לא יפריע. לכן במקום לכתוב main() int יכולנו לכתוב: int main ( ) אולם עימוד שכזה עלול להקשות מאוד על מתכנת אחר שיקרא את תכניתכם וינסה להבינה. אחת המטרות המרכזיות בכתיבת תכנית היא לכתוב תכנית קריאה. במקרים רבים הדבר חשוב יותר משאלת יעילותה של התכנית. מוסכמות (קונבנציות) רבות עוזרות להגדיל את הקריאות של תכניות. הראשונה ביניהן היא העימוד. כללי העימוד מורים למשל שאת השורה main() int כותבים כפי שכתבנו ולא באופן החלופי שהצגנו. כללי העימוד גם מורים כי פקודות התכנית המופיעות בין ה- ל- תופענה בהזזה ימינה כך שנקל יהיה להבחין בסוגריים, ולשים לב אילו פקודות תחומות ביניהם. 24